//package pers.zc.activiti.controller;
//
//import org.activiti.bpmn.converter.BpmnXMLConverter;
//import org.activiti.bpmn.model.*;
//import org.activiti.bpmn.model.Process;
//import org.activiti.engine.RepositoryService;
//import org.activiti.engine.RuntimeService;
//import org.activiti.engine.TaskService;
//import org.activiti.engine.repository.Deployment;
//import org.activiti.engine.repository.ProcessDefinition;
//import org.activiti.engine.runtime.ProcessInstance;
//import org.activiti.engine.task.Task;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//import pers.zc.activiti.service.TestService;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * @Annotion:
// * @ClassName: TestContorller
// * @Author: Lin Fuyuan
// * @Date: 2019/9/18  16:00
// * @Version: 1.0
// */
//@RestController
//@RequestMapping("/test")
//public class TestContorller {
//    /**
//     * 流程仓库Service ,用于管理流程仓库,例如 部署,删除,读取流程资源
//     */
//    @Autowired
//    private RepositoryService repositoryService;
//    /**
//     * 运行时service,可以处理所有正在运行状态的流程实例,任务等
//     */
//    @Autowired
//    private RuntimeService runtimeService;
//    /**
//     * 任务service,用户管理.查询任务,例如 签收 办理 指派 等
//     */
//    @Autowired
//    private TaskService taskService;
//    /**
//     * 自定义业务处理
//     */
//    @Autowired
//    private TestService testService;
//
//
////    /**
////     * 测试  bpmn 图id 为 test
////     * 发起流程
////     * 由userId1  处理
////     * 然后由  userId2 处理
////     * 结束
////     */
////    @RequestMapping("test")
////    public void test() {
////        //根据bpmn文件部署流程
////        Deployment deploy = repositoryService.createDeployment()//创建部署对象
////                .addClasspathResource("test.bpmn").name("testName")//指定流程文件 及名称
////                .deploy();//完成部署
////        System.out.println("流程id" + deploy.getId());
////        // 设置受理人变量 userId1 变量放入map中
////        Map<String, Object> variables = new HashMap<>();
////        variables.put("用户1", "007");
////        //获取流程实例
////        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
////
////        //采用key来启动流程定义并设置流程变量，返回流程实例
////        ProcessInstance test = runtimeService.startProcessInstanceByKey(processDefinition.getKey(), variables);//test: bpmn文件的id   variables : 设置的受理人变量
////        //获取实例id
////        String processId = test.getId();
////        System.out.println("流程创建成功，当前流程实例ID：" + processId);
////
//////		runtimeService.suspendProcessInstanceById(processId); //根据实例id挂起实例
////        // 注意 这里需要拿userId1来查询，key-value需要拿value来获取任务
////        List<Task> userId1TaskList = taskService.createTaskQuery().taskAssignee("007").list();
////        System.out.println("---------------------------------");
////        System.out.println(userId1TaskList);
////        System.out.println("---------------------------------");
////        //设置第二个受理人变量
////        Map<String, Object> variables1 = new HashMap<>();
////        variables1.put("用户2", "008");
////        //userId1 的流程完成, 开始让第二个人受理
////        taskService.complete(userId1TaskList.get(0).getId(), variables1);
////        System.out.println("此时流程转到userId2");
////        //开始第二个流程
////        List<Task> userId2TaskList = taskService.createTaskQuery().taskAssignee("008").list();
////        System.out.println("---------------------------------");
////        System.out.println(userId2TaskList);//输出结果
////        System.out.println("---------------------------------");
////
////        userId2TaskList.forEach(task -> {
////            System.out.println("任务ID：" + task.getId());
////            System.out.println("任务的办理人：" + task.getAssignee());
////            System.out.println("任务名称：" + task.getName());
////            System.out.println("任务的创建时间：" + task.getCreateTime());
////            System.out.println("流程实例ID：" + task.getProcessInstanceId());
////            System.out.println("#######################################");
////        });
////    }
//
//    /**
//     * 部署流程
//     * 在部署流程定义这一步，数据库中操作三张表：ACT_RE_DEPLOYMENT（部署对象表）   ACT_RE_PROCDEF（流程定义表） ACT_GE_BYTEARRAY（资源文件表）
//     * ACT_GE_PROPERTY（主键生成表）
//     */
//    @RequestMapping("instance")
//    @ResponseBody
//    public String testCreateInstance() {
//        //根据bpmn文件部署流程
//        Deployment deploy = repositoryService.createDeployment().addClasspathResource("test.bpmn").name("testName").deploy();
//        System.out.println("流程id" + deploy.getId());
//        //流程实例id
//        return deploy.getId();
//    }
//
//    /**
//     * 用户1
//     *
//     * @param user 指定用户1
//     * @param id   实例id
//     */
//    @GetMapping("user1")
//    @ResponseBody
//    public String testUser1(@RequestParam String user, String id) {
//        // 设置受理人变量 userId1 变量放入map中
//        Map<String, Object> variables = new HashMap<>();
//
//        variables.put("用户1", user);
//        //获取流程实例
//        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(id).singleResult();
//        //采用key来启动流程定义并设置流程变量，返回流程实例
//        ProcessInstance test = runtimeService.startProcessInstanceByKey(processDefinition.getKey(), variables);
//        //获取实例id
//        String processId = test.getId();
//        System.out.println("流程创建成功，当前流程实例ID：" + processId);
//
//        //		runtimeService.suspendProcessInstanceById(processId); //根据实例id挂起实例
//        // 注意 这里需要拿userId1来查询，key-value需要拿value来获取任务
//        List<Task> userId1TaskList = taskService.createTaskQuery().taskAssignee(user).list();
//        userId1TaskList.forEach(task -> {
//            System.out.println("任务ID：" + task.getId());
//            System.out.println("任务的办理人：" + task.getAssignee());
//            System.out.println("任务名称：" + task.getName());
//            System.out.println("任务的创建时间：" + task.getCreateTime());
//            System.out.println("流程实例ID：" + task.getProcessInstanceId());
//            System.out.println("#######################################");
//        });
//        //返回任务id
//        return userId1TaskList.get(0).getId();
//
//    }
//
//    /**
//     * 用户2
//     *
//     * @param user
//     * @param id
//     */
//    @GetMapping("user2")
//    @ResponseBody
//    public String testUser2(@RequestParam String user, String id) {
//        //设置第二个受理人变量
//        Map<String, Object> variables1 = new HashMap<>();
//        variables1.put("用户2", user);
//        //userId1 的流程完成, 开始让第二个人受理
//        taskService.complete(id, variables1);
//        //开始第二个流程 ,根据用户名获取任务
//        List<Task> userId2TaskList = taskService.createTaskQuery().taskAssignee(user).list();
//        System.out.println("---------------------------------");
//        System.out.println(userId2TaskList);//输出结果
//        System.out.println("---------------------------------");
//
//        userId2TaskList.forEach(task -> {
//            System.out.println("任务ID：" + task.getId());
//            System.out.println("任务的办理人：" + task.getAssignee());
//            System.out.println("任务名称：" + task.getName());
//            System.out.println("任务的创建时间：" + task.getCreateTime());
//            System.out.println("流程实例ID：" + task.getProcessInstanceId());
//            System.out.println("#######################################");
//        });
//        //返回 任务id
//        return userId2TaskList.get(0).getId();
//    }
//
//    /**
//     * 结束流程
//     *
//     * @param
//     */
//    @GetMapping("endTest")
//    public void endTest(@RequestParam String id) {
//        //userId1 的流程完成, 开始让第二个人受理
//        taskService.complete(id);
//        System.out.println("流程结束!!!!!!!!!!!!");
//    }
//
//    /**
//     * bpmnModel 使用,用java 代码生成流程文件
//     */
//    @GetMapping("bpmn")
//    public void bpmnModelTest() {
//        //实例化BpmnModel对象
//        BpmnModel bpmnModel = new BpmnModel();
////开始节点的属性
//        StartEvent startEvent = new StartEvent();
//        startEvent.setId("start1shareniu");
//        startEvent.setName("start1shareniu");
////普通的UserTask节点
//        UserTask userTask = new UserTask();
//        userTask.setId("userTask1shareniu");
//        userTask.setName("userTask1shareniu");
////结束节点属性
//        EndEvent endEvent = new EndEvent();
//        endEvent.setId("endEventshareniu");
//        endEvent.setName("endEventshareniu");
////连线信息
//        List<SequenceFlow> sequenceFlows = new ArrayList<SequenceFlow>();
//        List<SequenceFlow> toEnd = new ArrayList<SequenceFlow>();
//        SequenceFlow s1 = new SequenceFlow();
//        s1.setId("starttouserTask");
//        s1.setName("starttouserTask");
//        s1.setSourceRef("start1shareniu");
//        s1.setTargetRef("userTask1shareniu");
//        sequenceFlows.add(s1);
//        SequenceFlow s2 = new SequenceFlow();
//        s2.setId("userTasktoend");
//        s2.setName("userTasktoend");
//        s2.setSourceRef("userTask1shareniu");
//        s2.setTargetRef("endEventshareniu");
//        toEnd.add(s2);
//        startEvent.setOutgoingFlows(sequenceFlows);
//        userTask.setOutgoingFlows(toEnd);
//        userTask.setIncomingFlows(sequenceFlows);
//        endEvent.setIncomingFlows(toEnd);
//        //Process对象
//        Process process = new Process();
//        process.setId("process1");
//        process.addFlowElement(startEvent);
//        process.addFlowElement(s1);
//        process.addFlowElement(userTask);
//        process.addFlowElement(s2);
//        process.addFlowElement(endEvent);
//        bpmnModel.addProcess(process);
//
//        //bpmnModel 转换为标准的bpmn xml文件
//        BpmnXMLConverter bpmnXMLConverter=new BpmnXMLConverter();
//
//        byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);
//
//        String bytes=new String(convertToXML);
//
//        System.out.println(bytes);
//    }
//
//
//
//}
